﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using CTEM.Controllers.BUS;
using CTEM.Controllers.Global;
using CTEM.Models;
using DevExpress.XtraBars;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraEditors.DXErrorProvider;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraEditors;

namespace CTEM.ModuleForms.ManageMaterial
{
    public partial class MaterialManagement : DevExpress.XtraBars.Ribbon.RibbonForm
    {
        private List<CT_MaterialDTO> _listMaterial = new List<CT_MaterialDTO>();
        private List<CT_MaterialDTO> _listMaterialHistory = new List<CT_MaterialDTO>();
        private MaterialBUS _materialBus = new MaterialBUS();
        private bool _isNew;
        private bool _isUpdate;
        public MaterialManagement()
        {
            InitializeComponent();
            _isNew = false;
            _isUpdate = false;
            LoadMaterial();
        }

        private void LoadMaterial ()
        {
            _listMaterial = _materialBus.LoadAllMaterials();
            CT_MaterialDTOBindingSource.DataSource = _listMaterial;
        }

       private CT_MaterialDTO UppercaseFirstLetter(CT_MaterialDTO material)
       {
           material.MaterialName = Global.TitleCase(material.MaterialName);
           material.EstimateCalUnit = Global.TitleCase(material.EstimateCalUnit);
           material.RealCalUnit = Global.TitleCase(material.RealCalUnit);   
           return material;
       }
        

        private bool ValidateMaterial(CT_MaterialDTO material, out string output, out int i)
        {
            i = 0;
            if (String.IsNullOrEmpty(material.MaterialName))
            {
                output = "Xin hãy nhập Tên vật liệu";
                i = 0;
                return false;
            }
            foreach (var CT_MaterialDTO in _listMaterial)
            {
                if (!CT_MaterialDTO.MaterialName.ToUpper().Trim().Equals(material.MaterialName.ToUpper().Trim())
                    || CT_MaterialDTO.MaterialID.CompareTo(material.MaterialID) == 0)continue;
                {
                    output =
                        string.Format(
                            "Tên vật tư \"{0}\" mà bạn khởi tạo đã tồn tại.\n Vui lòng thử lại với tên khác.",
                            material.MaterialName);
                    i = 0;
                    return false;
                }
            }
            if (String.IsNullOrEmpty(material.EstimateCalUnit))
            {
                output = "Xin hãy nhập Đơn vị dự toán";
                i = 1;
                return false;
            }
            if (String.IsNullOrEmpty(material.RealCalUnit))
            {
                output = "Xin hãy nhập Đơn vị quyết toán";
                i = 2;
                return false;
            }
            if (Double.IsNaN(material.Ratio))
            {
                output = "Hệ số qui đổi phải là số";
                i = 2;
                return false;
            }
            output = "";
            return true;
        }

        private void gridView1_InitNewRow(object sender, DevExpress.XtraGrid.Views.Grid.InitNewRowEventArgs e)
        {
            _isNew = true;
        }

        private void gridView1_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            e.ExceptionMode = ExceptionMode.NoAction;
        }

        private void gridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            if (e.PrevFocusedRowHandle == DevExpress.XtraGrid.GridControl.NewItemRowHandle)
            {
                if (_isNew)
                {
                    gridView1.FocusedRowHandle = GridControl.NewItemRowHandle;
                }
            }
            if (_isUpdate)
            {
                _isUpdate = false;
                LoadMaterial();
            }
        }

        private void gridView1_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            if (_isNew)
            {
                var view = sender as ColumnView;
                var material = e.Row as CT_MaterialDTO;
                var chk = true;
                if (chk)
                {
                    String message = null;
                    int pos = -1;
                    if (!ValidateMaterial(material, out message, out pos))
                    {
                        e.Valid = false;
                        view.ClearColumnErrors();
                        view.SetColumnError(view.Columns[pos], message, ErrorType.Warning);
                        DialogResult result = XtraMessageBox.Show(message + "\nBạn có muốn nhập lại thông tin", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                        if (result == DialogResult.No)
                        {
                            _isNew = false;
                            e.Valid = true;
                            LoadMaterial();
                        }
                    }
                    else
                    {
                        material = UppercaseFirstLetter(material);
                        long success = _materialBus.CreateMaterials((material));
                        if (success == 0)
                        {
                            e.Valid = false;
                        }
                        else
                        {
                            if (material != null)
                            {
                                material.MaterialID = success;
                                material.Status = 1;
                                _listMaterialHistory.Add(material);
                            }
                            _isNew = false;
                            LoadMaterial();
                        }
                    }
                }

            }
        }

        private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {
            if (!_isNew)
            {
                var view = sender as ColumnView;
                var i = e.RowHandle;
                var material = gridView1.GetRow(i) as CT_MaterialDTO;
                if (material != null)
                {
                    var oldMaterial = _materialBus.GetMaterialById(material.MaterialID);
                    var message = "";
                    var pos = -1;
                    if (!ValidateMaterial(material, out message, out pos))
                    {
                        DialogResult result = XtraMessageBox.Show(message + "\nBạn có muốn nhập lại thông tin", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                        view.SetColumnError(view.Columns[pos], message, ErrorType.Warning);
                        if (result == DialogResult.No)
                        {
                            _isUpdate = false;
                            view.ClearColumnErrors();
                            LoadMaterial();
                            return;
                        }
                        else
                        {
                            _isUpdate = true;
                            gridView1.FocusedRowHandle = i;
                            gridView1.FocusedColumn = e.Column;
                            return;
                        }
                    }
                    material = UppercaseFirstLetter(material);
                    if (!_materialBus.UpdateMaterials((material)))
                    {
                        XtraMessageBox.Show("Không thể cập nhật thông tin vật tư", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        _isUpdate = false;
                    }
                    else
                    {
                        _isUpdate = false;
                        if (oldMaterial != null)
                        {
                            oldMaterial.Status = 2;
                            _listMaterialHistory.Add(oldMaterial);
                        }
                    }
                }
            }
        }

        private void btnUndo_ItemClick(object sender, ItemClickEventArgs e)
        {
            if (_listMaterialHistory.Count <= 0) return;
            var undoItem = _listMaterialHistory[_listMaterialHistory.Count - 1];
            switch (undoItem.Status)
            {
                case 1:
                    foreach (var material in _listMaterial)
                        if (undoItem.MaterialID == material.MaterialID)
                        {
                            _materialBus.deleteMaterials((material.MaterialID));
                            _listMaterialHistory.RemoveAt(_listMaterialHistory.Count - 1);
                            LoadMaterial();
                            break;
                        }
                    break;
                case 2:
                    foreach (var material in _listMaterial)
                        if (undoItem.MaterialID == material.MaterialID)
                        {
                            _materialBus.UpdateMaterials((undoItem));
                            _listMaterialHistory.RemoveAt(_listMaterialHistory.Count - 1);
                            LoadMaterial();
                            break;
                        }
                    break;
                case 3:
                    _materialBus.CreateMaterials((undoItem));
                    _listMaterialHistory.RemoveAt(_listMaterialHistory.Count - 1);
                    LoadMaterial();
                    break;
                default:
                    break;
            }
        }

        private void btnDelete_ItemClick(object sender, ItemClickEventArgs e)
        {
            int rowIndex = gridView1.FocusedRowHandle;
            var material = gridView1.GetRow(rowIndex) as CT_MaterialDTO;
            if (material != null)
                if (XtraMessageBox.Show(string.Format("Bạn có chắc chắn muốn xóa vật liệu \"{0}\" không?", material.MaterialName), "Cảnh báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    bool success = _materialBus.deleteMaterials((material.MaterialID));
                    if (success)
                    {
                        LoadMaterial();
                        material.Status = 3;
                        _listMaterialHistory.Add(material);
                    }
                    else
                        XtraMessageBox.Show("Không thể xóa phương tiện này.", "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
        }
    }
}